package com.ymitcloud.module.promotion.controller.admin.coupon.vo.template;


import static com.ymitcloud.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.ymitcloud.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;


import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;


import org.springframework.format.annotation.DateTimeFormat;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ymitcloud.framework.common.validation.InEnum;
import com.ymitcloud.module.promotion.enums.common.PromotionDiscountTypeEnum;
import com.ymitcloud.module.promotion.enums.common.PromotionProductScopeEnum;
import com.ymitcloud.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;


/**
* 优惠劵模板 Base VO，提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段，请不要添加到这里，影响 Swagger 文档生成
*/
@Data
public class CouponTemplateBaseVO {


    /** 
     * 优惠劵名
     */
    @NotNull(message = "优惠劵名不能为空")
    private String name;

    /** 
     * 发行总量
     */
    @NotNull(message = "发行总量不能为空")
    private Integer totalCount;

    /** 
     * 每人限领个数
     */
    @NotNull(message = "每人限领个数不能为空")
    private Integer takeLimitCount;

    /** 
     * 领取方式
     */
    @NotNull(message = "领取方式不能为空")
    private Integer takeType;

    /** 
     * 是否设置满多少金额可用
     */
    @NotNull(message = "是否设置满多少金额可用不能为空")
    private Integer usePrice;

    /** 
     * 商品范围
     */

    @NotNull(message = "商品范围不能为空")
    @InEnum(PromotionProductScopeEnum.class)
    private Integer productScope;


    /** 
     * 商品范围编号的数组
     */
    private List<Long> productScopeValues;

    /** 
     * 生效日期类型
     */

    @NotNull(message = "生效日期类型不能为空")
    @InEnum(CouponTemplateValidityTypeEnum.class)
    private Integer validityType;


    /** 
     * 固定日期 - 生效开始时间
     */

    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
    private LocalDateTime validStartTime;


    /** 
     * 固定日期 - 生效结束时间
     */

    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
    private LocalDateTime validEndTime;


    /** 
     * 领取日期 - 开始天数
     */
    @Min(value = 0L, message = "开始天数必须大于 0")
    private Integer fixedStartTerm;

    /** 
     * 领取日期 - 结束天数
     */
    @Min(value = 1L, message = "开始天数必须大于 1")
    private Integer fixedEndTerm;

    /** 
     * 优惠类型
     */

    @NotNull(message = "优惠类型不能为空")
    @InEnum(PromotionDiscountTypeEnum.class)
    private Integer discountType;


    /** 
     * 折扣百分比
     */
    private Integer discountPercent;

    /** 
     * 优惠金额
     */
    @Min(value = 0, message = "优惠金额需要大于等于 0")
    private Integer discountPrice;

    /** 
     * 折扣上限
     */

    private Integer discountLimitPrice;

    @AssertTrue(message = "商品范围编号的数组不能为空")
    @JsonIgnore
    public boolean isProductScopeValuesValid() {
        return Objects.equals(productScope, PromotionProductScopeEnum.ALL.getScope()) // 全部范围时，可以为空
                || CollUtil.isNotEmpty(productScopeValues);
    }

    @AssertTrue(message = "生效开始时间不能为空")
    @JsonIgnore
    public boolean isValidStartTimeValid() {
        return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.DATE.getType())
                || validStartTime != null;
    }

    @AssertTrue(message = "生效结束时间不能为空")
    @JsonIgnore
    public boolean isValidEndTimeValid() {
        return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.DATE.getType())
                || validEndTime != null;
    }

    @AssertTrue(message = "开始天数不能为空")
    @JsonIgnore
    public boolean isFixedStartTermValid() {
        return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.TERM.getType())
                || fixedStartTerm != null;
    }

    @AssertTrue(message = "结束天数不能为空")
    @JsonIgnore
    public boolean isFixedEndTermValid() {
        return ObjectUtil.notEqual(validityType, CouponTemplateValidityTypeEnum.TERM.getType())
                || fixedEndTerm != null;
    }

    @AssertTrue(message = "折扣百分比需要大于等于 1，小于等于 99")
    @JsonIgnore
    public boolean isDiscountPercentValid() {
        return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PERCENT.getType())
                || (discountPercent != null && discountPercent >= 1 && discountPercent<= 99);
    }

    @AssertTrue(message = "优惠金额不能为空")
    @JsonIgnore
    public boolean isDiscountPriceValid() {
        return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PRICE.getType())
                || discountPrice != null;
    }

    @AssertTrue(message = "折扣上限不能为空")
    @JsonIgnore
    public boolean isDiscountLimitPriceValid() {
        return ObjectUtil.notEqual(discountType, PromotionDiscountTypeEnum.PERCENT.getType())
                || discountLimitPrice != null;
    }

}
